#include "readertomodel.h"
#include <QFile>
#include <QXmlStreamReader>
#include <QXmlStreamAttributes>
#include <QAbstractItemModel>
#include <QDebug>
#include "sd.h"

ReaderToModel::ReaderToModel(QAbstractItemModel *M, QXmlStreamReader *R, QObject *parent):
		QObject(parent), space(trUtf8("Љ")), r(R), m(M){}

ReaderToModel::~ReaderToModel(){
	if(r!=NULL)
		delete r;
}

bool ReaderToModel::isEndAnketa(){
	if (r->tokenType() == QXmlStreamReader::EndElement)
		if(r->name() == trUtf8("Анкета")){
			qDebug()<<trUtf8("Конец анкеты.");
			return true;
		}
		else
			return false;
	else
		return false;
}

bool ReaderToModel::isEndVopros(){
	if (r->tokenType() == QXmlStreamReader::EndElement)
		if(r->name() == trUtf8("Вопрос")){
			qDebug()<<trUtf8("Конец вопроса.");
			return true;
		}
		else
			return false;
	else
		return false;
}

/** Прочту данные из xml.*/
void ReaderToModel::read(){
//---Если читаем из файла, то открываю его.-----------------------------------------------
	QFile *f = 0;
	if(f = qobject_cast<QFile *>(r->device()))
		f->open(QIODevice::ReadOnly);

//--Работаю только, если есть модель.--------------------------------------------------
	if (m == NULL){ // Если указатель не указывает на модель
		qDebug()<<trUtf8("Указатель не указывает на модель.");
		return;
	}

//--Прочту данные.---------------------------------------------------------------------
	QModelIndex i;
	int n;
	QXmlStreamAttributes atr;
	while (!r->atEnd()) {
		r->readNext();
qDebug()<<r->name()<<' '<<r->tokenType();
		///Разбираю анкету.//////////////////////////////////////////////////////////
		if (r->tokenType() == QXmlStreamReader::StartElement){
			if(r->name() == trUtf8("Анкета")){
				// Переберу внутренности анкеты, пока не найду </Анкета>
				while (!isEndAnketa()){
					r->readNext();
qDebug()<<r->name()<<' '<<r->tokenType();
					if(r->atEnd()) // Если конец документа раньше времени
						qDebug()<<trUtf8("Нет </Анкета>.");

					//==Разбираю вопрос.===================================================
					if (r->tokenType() == QXmlStreamReader::StartElement){
						if(r->name() == trUtf8("Вопрос")){
qDebug()<<trUtf8("Нашёл <Вопрос>.");
							// Заполню данные в модели.
							n = m->rowCount();
							m->insertRow(n);
							atr = r->attributes();
							if (atr.hasAttribute(trUtf8("Текст")))
								sd(m, n, 0, atr.value(trUtf8("Текст")).toString());
							else
								sd(m, n, 0, trUtf8("Текст вопроса не найден"));
							if (atr.hasAttribute(trUtf8("Тип")))
								sd(m, n, 1, atr.value(trUtf8("Тип")).toString());
							else
								sd(m, n, 1, trUtf8("Тип вопроса не найден"));
							i = m->index(n, 0);
							m->insertColumns(0, 2, i);
							// Переберу внутренности вопроса, пока не найду </Вопрос>
							while (!isEndVopros()){
								r->readNext();
qDebug()<<r->name()<<' '<<r->tokenType();
								if(r->atEnd() || isEndAnketa()) // Если раньше времени
																								// конец документа или
																								// конец анккеты
									qDebug()<<trUtf8("Нет </Вопрос>.");

								//--Разбираю ответ.-----------------------------------------------
								if (r->tokenType() == QXmlStreamReader::StartElement){
									if(r->name() == trUtf8("Ответ")){
qDebug()<<trUtf8("Нашёл <Ответ>.");
										// Заполню данные в модели.
										n = m->rowCount(i);
										m->insertRow(n, i);
										atr = r->attributes();
										if (atr.hasAttribute(trUtf8("Текст")))
											sd(m, n, 0, atr.value(trUtf8("Текст")).toString(), i);
										else
											sd(m, n, 0, trUtf8("Текст Ответа не найден"), i);
										// Ответ должен сразу закрыться.
										r->readNext();
										if(r->tokenType() != QXmlStreamReader::EndElement)
											qDebug()<<trUtf8("Элемент Ответ не закрылся.");
									}else
										qDebug()<<trUtf8("Неверный элемент. Ожидаю <Ответ>");
								}else
									qDebug()<<trUtf8("Неверный токен. Ожидаю элемент <Ответ>");
								//----------------------------------------------------------------
							}
						}else
							qDebug()<<trUtf8("Неверный элемент. Ожидаю <Вопрос>");
					}else
						qDebug()<<trUtf8("Неверный токен. Ожидаю элемент <Вопрос>");
					//=====================================================================
				}
			}else
				qDebug()<<trUtf8("Нет анкеты.");
		}else
			qDebug()<<trUtf8("Неверный токен. Ожидаю элемент <Анкета>");
		///////////////////////////////////////////////////////////////////////////////
	}


//--Если читаем из файла, то закрываю его.------------------------------------------------
	if(f) f->close();
}

QXmlStreamReader * ReaderToModel::streamReader(){
	return r;
}

void ReaderToModel::setStreamReader(QXmlStreamReader * streamReader){
	if(r!=NULL)
		delete r;
	r = streamReader;
}
